
# 函数库文件的成员

# 一个函数库文件由多个文件组成, 可以用如下格式指定函数库文件及其组成:
# archive(member)
# 这个不是一个命令, 而一个目标和依赖的定义
# 一般来说, 这种用法基本上就是为了 ar 命令来服务的, 如:

foolib(hack.o) : hack.o
	ar cr foolib hack.o

# 如果要指定多个 member, 那就以空格分开, 如
foolib(hack.o kludge.o)  # 等价于
foolib(hack.o) foolib(kludge.o)
# 还可以使用 Shell 的文件通配符来定义, 如:
foolib(*.o)








# 函数库成员的隐含规则
当make搜索一个目标的隐含规则时, 一个特殊的特性是, 如果这个目标是a(m)形式的, 其会把目标变成(m)
于是如果我们的成员是 %.o 的模式定义, 并且如果我们使用make foo.a(bar.o)的形式调用Makefile时
隐含规则会去找 bar.o的规则, 如果没有定义 bar.o 的规则, 那么内建隐含规则生效
make会去找 bar.c文件来生成 bar.o, 如果找得到的话, make执行的命令大致如下:
cc -c bar.c -o bar.o
ar r foo.a bar.o
rm -f bar.o









# 函数库文件的后缀规则

# 举例
.c.a:
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
	$(AR) r $@ $*.o
	$(RM) $*.o

# 等价于
(%.o) : %.c
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
	$(AR) r $@ $*.o
	$(RM) $*.o


# 在进行函数库打包文件生成时, 请小心使用make的并行机制(-j参数)
# 如果多个ar命令在同一时间运行在同一个函数库打包文件上, 就很有可以损坏这个函数库文件
# 所以, 在make未来的版本中, 应该提供一种机制来避免并行操作发生在函数打包文件上
# 但就目前而言, 你还是应该不要尽量不要使用-j参数